/*
 * JsonLevel.cpp
 *
 *  Created on: Nov 21, 2013
 *      Author: javier
 */

#include "JsonLevel.h"
#include "Pieza.h"
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>

using Golosinas::Button;
using Golosinas::GoldenStar;
using Golosinas::MiniBar;
using std::string;
using std::ifstream;

Json::Value JsonLevel::level;

void JsonLevel::setLevel(const string& nivel){
	ifstream archivo(nivel.c_str());
	archivo >> level;
	archivo.close();
}

Json::Value::iterator JsonLevel::getIterator(string tag){
	 return level[tag].begin();
}

Json::Value::iterator JsonLevel::getFinIterator(string tag){
	 return level[tag].end();
}

Pieza * JsonLevel::getPiezaProb(Json::Value::iterator it) {
	Pieza * p;
	Pieza::color c;
	int probBut = (*it)["pButDef"].asInt();
	int probBar = probBut + (*it)["pBarDef"].asInt();
	//genera dos numeros aleatorios
	int probPieza = (rand() % 100) + 1;
	int probColor = (rand() % 100) + 1;
	if (probPieza < probBut) {
		int pAma = (*it)["pButAma"].asInt();
		int pAzul = (*it)["pButAzu"].asInt() + pAma;
		int pRojo = (*it)["pButRoj"].asInt() + pAzul;
		int pVerde = (*it)["pButVer"].asInt() + pRojo;
		if (probColor < pAma) {
			c = Pieza::amarillo;
		}else if (probColor < pAzul) {
			c = Pieza::azul;
		}else if (probColor < pRojo) {
			c = Pieza::rojo;
		}else if (probColor < pVerde) {
			c = Pieza::verde;
		}else {
			c = Pieza::violeta;
		}
		Button * boton = new Button(c);
		p = boton;
	} else if (probPieza < probBar) {
		int pAma = (*it)["pBarAma"].asInt();
		int pAzul = (*it)["pBarAzu"].asInt() + pAma;
		int pRojo = (*it)["pBarRoj"].asInt() + pAzul;
		int pVerde = (*it)["pBarVer"].asInt() + pRojo;
		if (probColor < pAma) {
			c = Pieza::amarillo;
		}else if (probColor < pAzul) {
			c = Pieza::azul;
		}else if (probColor < pRojo) {
			c = Pieza::rojo;
		}else if (probColor < pVerde) {
			c = Pieza::verde;
		}else {
			c = Pieza::violeta;
		}
		//orientacion random
		MiniBar * mBar = new MiniBar(c, MiniBar::orientacion(rand() % 2));
		p = mBar;
	} else {
		GoldenStar * gStar = new GoldenStar();
		p = gStar;
	}
	return p;
}

Pieza * JsonLevel::getPiezaProb(int nCol) {
	Pieza * p;
	int contador = 0;
	Json::Value::iterator it = level["columnas"].begin();
	while(contador < nCol){
		++it;
		contador++;
	}
	p = getPiezaProb(it);
	return p;
}

int JsonLevel::getFilas(){
	return level["numFilas"].asInt();
}

int JsonLevel::getColumnas(){
	return level["numColumnas"].asInt();
}

int JsonLevel::getMaxPuntos(){
	return level["puntaje"].asInt();
}

string JsonLevel::getFondo(){
	return level["fondo"].asString();
}
